package DB;


import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import forRecherche.MotRequete;

import ForParser.Parser;

/**
 * Singleton pattern
 * @author louis
 *
 */

public class BddManager {
	private BddView dbView;
	private static BddManager instance = null;

	private BddManager(){
		this.dbView = new BddView();
	}



	public static BddManager getInstance()
	{	
		if (instance == null)
		{ instance = new BddManager();	
		}
		return instance;
	}

	/**
	 * Fonction pour se connecter a la base de donnee
	 */
	public void connectBdd(){
		this.dbView.connectBdd();
	}

	/**
	 * Affiche le contenu de la base de donnee
	 */
	public void printBdd(){
		ResultSet rs = this.dbView.printBdd();

		//print result
		try {
			while(rs.next()){
				//Retrieve by column namea
				String mot = rs.getString("Mot");
				String document = rs.getString("Document");
				int ponderation = rs.getInt("Ponderation");

				System.out.print("Mot : " + mot); System.out.print(", Document : " + document);System.out.println(", Ponderation : "+ponderation);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}


	public boolean existeInBDD(String mot,String document) throws SQLException{
		ResultSet rs = this.dbView.existeInBDD(mot, document);

		return (rs.next());
	}

	public void ajouterPonderation(String mot, String document, int ponderation){
		int currentPonderation =0;
		try {
			currentPonderation = this.getPonderation(mot, document);
			currentPonderation += ponderation;
			this.setPonderation(mot, document, currentPonderation);
		} catch (SQLException e) {
			e.printStackTrace();
		}

	}

	private int getPonderation(String mot, String document) throws SQLException{
		ResultSet rs = this.dbView.getPonderation(mot, document);
		rs.next();
		return rs.getInt("Ponderation");
	}

	private void setPonderation(String mot, String document, int ponderation) throws SQLException{
		this.dbView.setPonderation(mot, document, ponderation);
	}

	public void ajouterMot(String mot, String document, int ponderation){
		try{
			this.dbView.ajouterMot(mot,document, ponderation);
		}catch (Exception e){
			System.out.println("Erreur Ajout : L'entree est probablement deja presente "+e.getMessage());
		}
	}
	
	public void ajouterMot(String mot, String document, int ponderation,String balise) throws SQLException{
		try{
			this.dbView.ajouterMot(mot,document, ponderation);
		}catch (Exception e){
			//le mot est deja present (?!)
			int pondNouv = this.getPonderation(mot, document) + Parser.getPonderationFromBalise(balise);
			this.setPonderation(mot, document, pondNouv);
		}
	}

	/**
	 * Insere un mot dans la DB si il n'y est pas
	 * @param mot
	 * @param document
	 * @param balise
	 */
	public void traiter_mot(String mot, String document, String balise){
		int ponderationNouv = Parser.getPonderationFromBalise(balise);
		
		//si (mot,document) est deja dans la bdd
		try {
			if(existeInBDD(mot, document)){
				//ponderation(mot,document)+=ponderationNouv
				setPonderation(mot, document, getPonderation(mot, document) + ponderationNouv);
			}else{
				ajouterMot(mot, document, ponderationNouv);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public void supprimerMot(String mot){
		this.dbView.deleteMot(mot);
	}

	/**
	 * Pour le document donné, on regarde sa ponderation pour chaque mot de la requete (on renvoie alors un vecteur)
	 * @param requete
	 * @param nomDocument
	 * @return
	 */
	public ArrayList<Float> getVecteurPonderation(ArrayList<MotRequete> requete, String nomDocument){
		ArrayList<Float> resultat = new ArrayList<Float>();

		for(MotRequete i : requete){
			Float ponderation;
			try {
				ponderation = new Float(this.getPonderation(i.getMot(), nomDocument));
				//On multiplie la ponderation du mot dans le document par la ponderation du mot dans la requete
				ponderation = ponderation * i.getPonderation();
				resultat.add(ponderation);
			} catch (SQLException e) {
				resultat.add((float) 0);
			}

		}
		return resultat;

	}
}
